home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / misc / gms_dev.lha / GMSDev / Source / Asm / Demos / Pobs.s < prev    next >
Encoding:
Text File  |  1998-05-07  |  9.8 KB  |  410 lines

  1. ;-------T-------T------------------------T----------------------------------;
  2. ;This demo originally came from the HowToCode series.
  3. ;
  4. ;This demo took just 15 minutes in being converted to a multi-tasking demo,
  5. ;with no speed loss in run-time.
  6.  
  7.     INCDIR    "GMSDev:Includes/"
  8.     INCLUDE    "dpkernel/dpkernel.i"
  9.  
  10. width    EQU    40
  11. height    EQU    256
  12.  
  13.     SECTION    "Pobs",CODE
  14.  
  15. ;==========================================================================;
  16. ;                             INITIALISE DEMO
  17. ;==========================================================================;
  18.  
  19.     STARTDPK
  20.  
  21. Start:    MOVEM.L    A0-A6/D1-D7,-(SP)
  22.     move.l    DPKBase(pc),a6
  23.     lea    ScreenTags(pc),a0
  24.     sub.l    a1,a1
  25.     CALL    Init
  26.     tst.l    d0
  27.     beq.s    .Exit
  28.  
  29.     move.l    Screen(pc),a0
  30.     CALL    Display
  31.  
  32.     moveq    #ID_JOYDATA,d0    ;Get joydata structure.
  33.     CALL    Get
  34.     move.l    d0,JoyData
  35.     beq.s    .Exit
  36.     move.l    d0,a0    ;Initialise the joydata structure.
  37.     sub.l    a1,a1
  38.     CALL    Init
  39.     tst.l    d0
  40.     beq.s    .Exit
  41.  
  42.     bsr.s    Main
  43.  
  44. .Exit    move.l    DPKBase(pc),a6
  45.     move.l    JoyData(pc),a0
  46.     CALL    Free
  47.     move.l    Screen(pc),a0
  48.     CALL    Free
  49.     MOVEM.L    (SP)+,A0-A6/D1-D7
  50.     moveq    #ERR_OK,d0
  51.     rts
  52.  
  53. ;==========================================================================;
  54. ;                                MAIN LOOP
  55. ;==========================================================================;
  56.  
  57. Main:    bsr.s    InPtabs
  58.     bsr.w    Rmasks
  59.  
  60. .loop    move.l    SCRBase(pc),a6
  61.     CALL    scrWaitAVBL
  62.  
  63.     move.l    Screen(pc),a0
  64.     CALL    scrSwapBuffers
  65.  
  66.     move.l    DPKBase(pc),a6
  67.     move.l    Screen(pc),a1    ;a1 = Screen
  68.     move.l    GS_Bitmap(a1),a0    ;a0 = Bitmap
  69.     CALL    Clear
  70.  
  71.     bsr.w    Calc
  72.     bsr.w    Put
  73.  
  74.     cmp.w    #293-1,number
  75.     beq.b    .mouse
  76.     addq.w    #1,number
  77.  
  78. .mouse    move.l    DPKBase(pc),a6
  79.     move.l    JoyData(pc),a0
  80.     CALL    Query
  81.     move.l    JoyData(pc),a0
  82.     move.l    JD_Buttons(a0),d0
  83.     btst    #JB_LMB,d0
  84.     beq.s    .loop
  85.     rts
  86.  
  87. ;===========================================================================;
  88. ;                            SET UP POB TABLES
  89. ;===========================================================================;
  90.  
  91. InPtabs    lea    pob_xbuffer,a0    ;a0 = Ptr to XBuffer.
  92.     moveq    #$00,d0    ;d0 = 00.
  93. .xloop    move.w    d0,d1
  94.     and.w    #$000f,d1    ;d1 = $000x
  95.     lsl.w    #6,d1    ;d1 = <<6
  96.     move.w    d1,(a0)+    ;a0 = +d1
  97.     move.w    d0,d1
  98.     and.w    #$fff0,d1    ;d2 = $xxx0
  99.     ror.w    #3,d1    ;d2 = $?xxx
  100.     move.w    d1,(a0)+    ;a0 = +d2
  101.     addq.w    #1,d0    ;d0 = ++1
  102.     cmp.w    #width*8,d0    ;d0 > Is d0 == ScreenWidth?
  103.     bne.b    .xloop
  104.  
  105.     lea    pob_ybuffer,a0
  106.     moveq    #$00,d0
  107. .yloop    move.w    d0,d1
  108.     mulu    #width,d1
  109.     move.l    d1,(a0)+
  110.     addq.w    #1,d0
  111.     cmp.w    #height,d0
  112.     bne.b    .yloop
  113.     rts
  114.  
  115. ;===========================================================================;
  116. ;
  117. ;===========================================================================;
  118.  
  119. Rmasks:    moveq    #0,d7
  120.     lea    shape_buffer,a1
  121. .loop1    lea    pob_shape(pc),a0
  122.     move.w    #16,d6
  123. .loop2    move.l    (a0)+,d0
  124.     ror.l    d7,d0
  125.     move.l    d0,(a1)+
  126.     subq.w    #1,d6
  127.     bne.b    .loop2
  128.     addq.w    #1,d7
  129.     cmpi.w    #16,d7
  130.     bne.b    .loop1
  131.     rts
  132.  
  133. ;===========================================================================;
  134. ;                       ADJUST POB SCREEN POSITIONS
  135. ;===========================================================================;
  136.  
  137. Calc:    move.w    #$eeee,d0
  138.     move.w    #720,d6
  139.     lea    sinx_pointer1(pc),a0
  140.  
  141.     movem.l    (a0),a2/a3/a4/a5
  142.     movem.w    sinx_add1(pc),d2/d3/d4/d5
  143.  
  144.     add.w    d2,a2
  145.     cmp.w    (a2),d0
  146.     bne.s    .bkip1
  147.     sub.w    d6,a2
  148.  
  149. .bkip1    add.w    d3,a3
  150.     cmp.w    (a3),d0
  151.     bne.s    .bkip2
  152.     sub.w    d6,a3
  153.  
  154. .bkip2    add.w    d4,a4
  155.     cmp.w    (a4),d0
  156.     bne.s    .bkip3
  157.     sub.w    d6,a4
  158.  
  159. .bkip3    add.w    d5,a5
  160.     cmp.w    (a5),d0
  161.     bne.s    .bkip4
  162.     sub.w    d6,a5
  163.  
  164. .bkip4    movem.l    a2/a3/a4/a5,(a0)
  165.     lea    coord_stack,a0
  166.     movem.w    sinx_dist1(pc),d3-d4/a1/a6
  167.     move.w    d0,d5
  168.     move.w    number(pc),d7    ;d7 = Number of Pobs.
  169. .loop    add.w    d3,a2
  170.     add.w    d4,a3
  171.     cmp.w    (a2),d5
  172.     bne.s    .not_x1
  173.     sub.w    d6,a2
  174. .not_x1    cmp.w    (a3),d5
  175.     bne.s    .not_x2
  176.     suba.w    d6,a3
  177. .not_x2    move.w    (a2),d0
  178.     add.w    (a3),d0
  179.     add.w    a1,a4
  180.     add.w    a6,a5
  181.     cmp.w    (a4),d5
  182.     bne.b    .not_y1
  183.     sub.w    d6,a4
  184. .not_y1    cmp.w    (a5),d5
  185.     bne.b    .not_y2
  186.     sub.w    d6,a5
  187. .not_y2    move.w    (a4),d1
  188.     add.w    (a5),d1
  189.     move.w    d0,(a0)+
  190.     move.w    d1,(a0)+
  191.     dbf    d7,.loop
  192.     rts
  193.  
  194. ;===========================================================================;
  195. ;                          PLACE POBS ON SCREEN
  196. ;===========================================================================;
  197.  
  198. Put:    lea    pob_xbuffer,a0
  199.     lea    pob_ybuffer,a1
  200.     lea    shape_buffer,a4
  201.     move.l    Screen(pc),a6
  202.     move.l    GS_MemPtr2(a6),a6
  203.     lea    coord_stack,a5
  204.  
  205.     move.w    number(pc),d7
  206. .loop    movem.w    (a5)+,d0/d1    ;d0 = X, d1 = Y
  207.     add.w    d0,d0
  208.     add.w    d0,d0    ;d0 = (XCoord)*4
  209.     add.w    d1,d1
  210.     add.w    d1,d1    ;d1 = (YCoord)*4
  211.     move.l    (a0,d0.w),d0
  212.     lea    width(a6,d0.w),a3
  213.     add.l    (a1,d1.w),a3
  214.     swap    d0
  215.     lea    (a4,d0.w),a2
  216.     movem.l    (a2),d0-d5    ;d0..d5 = POB Gfx Data. 
  217.     or.l    d0,(a3)
  218.     or.l    d1,width(a3)
  219.     or.l    d2,width*2(a3)
  220.     or.l    d3,width*3(a3)
  221.     or.l    d4,width*4(a3)
  222.     or.l    d5,width*5(a3)
  223.     dbf    d7,.loop
  224.     rts
  225.  
  226. ;===========================================================================;
  227. ;
  228. ;===========================================================================;
  229.  
  230. JoyData:    dc.l  0
  231.  
  232. sinx_pointer1:    dc.l  sin_xtab
  233. sinx_pointer2:    dc.l  sin_xtab
  234. siny_pointer1:    dc.l  sin_ytab
  235. siny_pointer2:    dc.l  sin_ytab
  236. sinx_add1:    dc.w  1*2    ;change values here to obtain
  237. sinx_add2:    dc.w  5*2    ;new patterns
  238. siny_add1:    dc.w  3*2
  239. siny_add2:    dc.w  2*2
  240. sinx_dist1:    dc.w  4*2
  241. sinx_dist2:    dc.w  3*2
  242. siny_dist1:    dc.w  1*2
  243. siny_dist2:    dc.w  2*2
  244. number:        dc.w  0            ;number of 'pobs'
  245.  
  246. sin_xtab:
  247.     dc.w    75,76,78,79,80,82,83,84
  248.     dc.w    85,87,88,89,91,92,93,94
  249.     dc.w    96,97,98,99,101,102,103,104
  250.     dc.w    106,107,108,109,110,111,112,114
  251.     dc.w    115,116,117,118,119,120,121,122
  252.     dc.w    123,124,125,126,127,128,129,130
  253.     dc.w    131,132,132,133,134,135,136,136
  254.     dc.w    137,138,139,139,140,141,141,142
  255.     dc.w    142,143,144,144,145,145,145,146
  256.     dc.w    146,147,147,147,148,148,148,149
  257.     dc.w    149,149,149,149,150,150,150,150
  258.     dc.w    150,150,150,150,150,150,150,150
  259.     dc.w    150,149,149,149,149,149,148,148
  260.     dc.w    148,147,147,147,146,146,145,145
  261.     dc.w    145,144,144,143,142,142,141,141
  262.     dc.w    140,139,139,138,137,136,136,135
  263.     dc.w    134,133,132,132,131,130,129,128
  264.     dc.w    127,126,125,124,123,122,121,120
  265.     dc.w    119,118,117,116,115,114,113,111
  266.     dc.w    110,109,108,107,106,104,103,102
  267.     dc.w    101,99,98,97,96,94,93,92
  268.     dc.w    91,89,88,87,85,84,83,82
  269.     dc.w    80,79,78,76,75,74,72,71
  270.     dc.w    70,68,67,66,65,63,62,61
  271.     dc.w    59,58,57,56,54,53,52,51
  272.     dc.w    49,48,47,46,44,43,42,41
  273.     dc.w    40,39,38,36,35,34,33,32
  274.     dc.w    31,30,29,28,27,26,25,24
  275.     dc.w    23,22,21,20,19,18,18,17
  276.     dc.w    16,15,14,14,13,12,11,11
  277.     dc.w    10,9,9,8,8,7,6,6
  278.     dc.w    5,5,5,4,4,3,3,3
  279.     dc.w    2,2,2,1,1,1,1,1
  280.     dc.w    0,0,0,0,0,0,0,0
  281.     dc.w    0,0,0,0,0,1,1,1
  282.     dc.w    1,1,2,2,2,3,3,3
  283.     dc.w    4,4,5,5,5,6,6,7
  284.     dc.w    8,8,9,9,10,11,11,12
  285.     dc.w    13,14,14,15,16,17,18,18
  286.     dc.w    19,20,21,22,23,24,25,26
  287.     dc.w    27,28,29,30,31,32,33,34
  288.     dc.w    35,36,37,39,40,41,42,43
  289.     dc.w    44,46,47,48,49,51,52,53
  290.     dc.w    54,56,57,58,59,61,62,63
  291.     dc.w    65,66,67,68,70,71,72,74
  292.     dc.w    75
  293.     dc.w    $eeee,$eeee,$eeee,$eeee
  294.     dc.w    $eeee,$eeee,$eeee,$eeee
  295.     dc.w    $eeee,$eeee,$eeee,$eeee
  296.     dc.w    $eeee,$eeee,$eeee,$eeee
  297.     dc.w    $eeee,$eeee,$eeee,$eeee
  298.     dc.w    $eeee,$eeee,$eeee,$eeee
  299.     dc.w    $eeee,$eeee,$eeee,$eeee
  300.     dc.w    $eeee,$eeee,$eeee,$eeee
  301.     dc.w    $eeee,$eeee,$eeee,$eeee
  302.     dc.w    $eeee,$eeee,$eeee,$eeee
  303.  
  304. sin_ytab:
  305.     dc.w    57,59,60,61,62,63,64,65
  306.     dc.w    66,66,67,68,69,70,71,72
  307.     dc.w    73,74,75,76,77,78,79,80
  308.     dc.w    81,82,83,84,84,85,86,87
  309.     dc.w    88,89,90,90,91,92,93,94
  310.     dc.w    94,95,96,97,97,98,99,100
  311.     dc.w    100,101,102,102,103,103,104,105
  312.     dc.w    105,106,106,107,107,108,108,109
  313.     dc.w    109,110,110,110,111,111,112,112
  314.     dc.w    112,112,113,113,113,114,114,114
  315.     dc.w    114,114,114,115,115,115,115,115
  316.     dc.w    115,115,115,115,115,115,115,115
  317.     dc.w    115,115,114,114,114,114,114,114
  318.     dc.w    113,113,113,112,112,112,112,111
  319.     dc.w    111,110,110,110,109,109,108,108
  320.     dc.w    107,107,106,106,105,105,104,103
  321.     dc.w    103,102,102,101,100,100,99,98
  322.     dc.w    97,97,96,95,94,94,93,92
  323.     dc.w    91,90,90,89,88,87,86,85
  324.     dc.w    84,84,83,82,81,80,79,78
  325.     dc.w    77,76,75,74,73,72,71,70
  326.     dc.w    69,68,67,66,66,65,64,63
  327.     dc.w    62,61,60,59,58,56,55,54
  328.     dc.w    53,52,51,50,49,49,48,47
  329.     dc.w    46,45,44,43,42,41,40,39
  330.     dc.w    38,37,36,35,34,33,32,31
  331.     dc.w    31,30,29,28,27,26,25,25
  332.     dc.w    24,23,22,21,21,20,19,18
  333.     dc.w    18,17,16,15,15,14,13,13
  334.     dc.w    12,12,11,10,10,9,9,8
  335.     dc.w    8,7,7,6,6,5,5,5
  336.     dc.w    4,4,3,3,3,3,2,2
  337.     dc.w    2,1,1,1,1,1,1,0
  338.     dc.w    0,0,0,0,0,0,0,0
  339.     dc.w    0,0,0,0,0,0,1,1
  340.     dc.w    1,1,1,1,2,2,2,3
  341.     dc.w    3,3,3,4,4,5,5,5
  342.     dc.w    6,6,7,7,8,8,9,9
  343.     dc.w    10,10,11,12,12,13,13,14
  344.     dc.w    15,15,16,17,18,18,19,20
  345.     dc.w    21,21,22,23,24,25,25,26
  346.     dc.w    27,28,29,30,31,31,32,33
  347.     dc.w    34,35,36,37,38,39,40,41
  348.     dc.w    42,43,44,45,46,47,48,49
  349.     dc.w    49,50,51,52,53,54,55,56
  350.     dc.w    57
  351.     dc.w    $eeee,$eeee,$eeee,$eeee
  352.     dc.w    $eeee,$eeee,$eeee,$eeee
  353.     dc.w    $eeee,$eeee,$eeee,$eeee
  354.     dc.w    $eeee,$eeee,$eeee,$eeee
  355.     dc.w    $eeee,$eeee,$eeee,$eeee
  356.     dc.w    $eeee,$eeee,$eeee,$eeee
  357.     dc.w    $eeee,$eeee,$eeee,$eeee
  358.     dc.w    $eeee,$eeee,$eeee,$eeee
  359.     dc.w    $eeee,$eeee,$eeee,$eeee
  360.     dc.w    $eeee,$eeee,$eeee,$eeee
  361.  
  362. pob_shape:
  363.     dc.w    %0000000110000000,0
  364.     dc.w    %0000000110000000,0
  365.     dc.w    %0000011111100000,0
  366.     dc.w    %0000011111100000,0
  367.     dc.w    %0000000110000000,0
  368.     dc.w    %0000000110000000,0
  369.  
  370. ;===========================================================================;
  371. ;                                  DATA
  372. ;===========================================================================;
  373.  
  374. ScreenTags:    dc.l  TAGS_SCREEN
  375. Screen:        dc.l  0
  376.         dc.l  GSA_MemPtr1,ScreenMem
  377.         dc.l  GSA_MemPtr2,ScreenMem+height*width
  378.         dc.l  GSA_MemPtr3,ScreenMem+height*width*2
  379.         dc.l  GSA_Width,320
  380.         dc.l  GSA_Height,256
  381.         dc.l  GSA_Attrib,SCR_TPLBUFFER
  382.         dc.l    GSA_BitmapTags,0
  383.         dc.l    BMA_Type,PLANAR
  384.         dc.l    BMA_Palette,.palette
  385.         dc.l    TAGEND,0
  386.         dc.l  TAGEND
  387.  
  388. .palette    dc.l  PALETTE_ARRAY,2
  389.         dc.l  $00000000,$00f0f000
  390.  
  391. ;===========================================================================;
  392.  
  393.     SECTION    Screens,BSS_C
  394.  
  395. ScreenMem:    ds.b  (height*width*3)+(width*50)
  396. shape_buffer:    ds.l  256
  397. pob_xbuffer:    ds.l  (width*8)
  398. pob_ybuffer:    ds.l  height
  399. coord_stack:    ds.l  1500
  400.  
  401. ;===========================================================================;
  402.  
  403. ProgName:    dc.b  "Pobs",0
  404. ProgAuthor:    dc.b  "Paul Manias",0
  405. ProgDate:    dc.b  "January 1998",0
  406. ProgCopyright:    dc.b  "DreamWorld Productions (c) 1996-1998.  Freely distributable.",0
  407. ProgShort:    dc.b  "Triple buffered bob demonstration.",0
  408.         even
  409.  
  410.